package com.scholarship.modules.admin.mapper;

import com.scholarship.modules.admin.dto.RankingListDto;
import com.scholarship.modules.admin.dto.RankingQueryDto;
import com.scholarship.modules.admin.dto.StudentInfoListDto;
import com.scholarship.modules.admin.dto.StudentQueryDto;
import com.scholarship.modules.admin.entity.UserInfo;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * t_user_info
 * @Author Z.J.H
 * @create 2021/9/5 14:39
 */
@Repository
public interface AUserInfoMapper {

    /**
     * 添加学生信息
     * @param userInfo
     */
    int insertUserInfo(@Param("userInfo") UserInfo userInfo) throws Exception;

    /**
     * 插入或更新多条学生基本信息
     * @param userInfoList 学生基本信息列表
     * @throws Exception
     */
    int insertAndUpdateUserInfoList(List<UserInfo> userInfoList) throws Exception;

    /**
     * 更新用户信息
     * @param userInfo
     */
    void updateUserInfo(@Param("userInfo") UserInfo userInfo) throws Exception;

    /**
     * 更新多条四六级成绩信息
     *
     * @param userInfoList 学生基本信息列表
     * @throws Exception
     */
    int updateCetList(List<UserInfo> userInfoList) throws Exception;

    /**
     * 批量更新学生加权平均分排名
     * @param userInfoList
     * @throws Exception
     */
    int updateRankByUserInfoList(List<UserInfo> userInfoList) throws Exception;

    /**
     * 批量更新学生综合测评总分及排名
     * @return
     */
    int updateTotalScoreAndTotalRank();

    /**
     * 批量更新学生综合测评总分
     * @return
     */
    int updateTotalScore();

    /**
     * 批量更新学生综合测评总分及排名
     * @return
     */
    int updateTotalRank();

    /**
     * 根据学号删除学生信息
     * @param userId
     */
    void deleteUserInfoByUserId(String userId);

    /**
     * 查询该邮箱是否存在
     * @param baseEmail  base64加密后的邮箱
     * @return
     */
    int getEmailIsExist(String baseEmail) throws Exception;

    /**
     * 通过用户id查询用户信息
     * @param userId
     * @return
     */
    UserInfo getUserInfoByUserId(String userId) throws Exception;

    /**
     * 是否存在该用户id数据
     * @param userId
     * @return
     * @throws Exception
     */
    Integer getCountByUserId(String userId) throws Exception;

    /**
     * 查询学生信息列表
     * @return
     */
    List<UserInfo> listUserInfo() throws Exception;

    /**
     * 根据学年和专业查询学生列表
     * @param year
     * @param major
     * @return
     * @throws Exception
     */
    List<UserInfo> listUserInfoByYearMajor(@Param("year") String year, @Param("major") String major) throws Exception;

    /**
     * 查询学生展示列表
     * @return
     */
    List<StudentInfoListDto> listStudentInfoListDto() throws Exception;

    /**
     * 根据查询条件查询学生列表
     * @param studentQueryDto
     * @return
     * @throws Exception
     */
    List<StudentInfoListDto> listStudentInfoListDtoByQuery(@Param("query") StudentQueryDto studentQueryDto) throws Exception;

    /**
     * 根据搜索查询学生列表
     * @param searchStr 搜索框字符串(姓名、学号)
     * @return
     * @throws Exception
     */
    List<StudentInfoListDto> listStudentInfoListDtoBySearch(@Param("searchStr") String searchStr) throws Exception;

    /**
     * 根据查询条件查询学生列表
     * @param userInfo  查询条件
     * @param orderByField 排序字段
     * @param isAsc    是否为升序
     * @param searchStr 搜索框字符串
     * @return  排序后的列表
     * @throws Exception
     */
    List<StudentInfoListDto> listStudentInfoListDtoByAll(@Param("query") StudentInfoListDto userInfo,
                                                         @Param("orderByField") String orderByField,
                                                         @Param("isAsc") Boolean isAsc,
                                                         @Param("searchStr") String searchStr) throws Exception;

    /**
     * 查询所有学号
     * @return
     * @throws Exception
     */
    List<String> listYear() throws Exception;

    /**
     * 查询所有专业
     * @return
     * @throws Exception
     */
    List<String> listMajor() throws Exception;

    /**
     * 查询所有班级
     * @return
     * @throws Exception
     */
    List<String> listStuClass() throws Exception;

    /**
     * 根据查询条件查询导出学生列表
     * @param studentQueryDto
     * @return
     */
    List<UserInfo> listExportStudentInfoByQuery(@Param("query") StudentQueryDto studentQueryDto);

    /**
     * 默认排名列表
     * @return  排名列表dto
     */
    List<RankingListDto> listRankingListDto();

    /**
     * 根据查询条件查询排名列表
     * @param rankingQueryDto
     * @return
     * @throws Exception
     */
    List<RankingListDto> listRankingListDtoByQuery(@Param("query") RankingQueryDto rankingQueryDto);

    /**
     * 根据搜索查询排名列表
     * @param searchStr 搜索框字符串(姓名、学号)
     * @return
     * @throws Exception
     */
    List<RankingListDto> listRankingListDtoBySearch(@Param("searchStr") String searchStr);
}
